package cn.kicsy.www.anonymous_bbs.service;

import org.lionsoul.ip2region.xdb.Searcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import jakarta.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

@Service
public class IpLocationService {
    
    private static final Logger logger = LoggerFactory.getLogger(IpLocationService.class);
    private static final String IPDB_FILE_NAME = "qqwry.ipdb";
    private static final String DOWNLOAD_URL = "https://github.com/nmgliangwei/qqwry.ipdb/releases/download/2025-09-17/qqwry.ipdb";
    
    private Searcher searcher;
    
    @PostConstruct
    public void init() {
        try {
            // 检查qqwry.ipdb文件是否存在
            Path ipdbPath = Paths.get(System.getProperty("user.dir"), "src", "main", "resources", IPDB_FILE_NAME);
            
            if (!Files.exists(ipdbPath)) {
                // 从资源目录复制或下载文件
                downloadIpdbFile(ipdbPath);
            }
            
            // 初始化搜索器
            searcher = Searcher.newWithFileOnly(ipdbPath.toString());
            logger.info("IP地理位置服务初始化成功");
        } catch (Exception e) {
            logger.error("初始化IP地理位置服务失败", e);
            throw new RuntimeException("初始化IP地理位置服务失败", e);
        }
    }
    
    private void downloadIpdbFile(Path ipdbPath) throws IOException {
        // 首先尝试从资源目录复制
        try (InputStream is = getClass().getResourceAsStream("/" + IPDB_FILE_NAME)) {
            if (is != null) {
                Files.copy(is, ipdbPath, StandardCopyOption.REPLACE_EXISTING);
                logger.info("从资源目录复制IP地理位置数据库文件成功");
                return;
            }
        }
        
        // 如果资源目录不存在，则下载文件
        logger.info("正在下载IP地理位置数据库文件...");
        
        try {
            URL url = new URL(DOWNLOAD_URL);
            try (InputStream is = url.openStream()) {
                Files.copy(is, ipdbPath, StandardCopyOption.REPLACE_EXISTING);
                logger.info("IP地理位置数据库文件下载完成");
            }
        } catch (IOException e) {
            logger.error("下载IP地理位置数据库文件失败", e);
            throw new IOException("无法下载IP地理位置数据库文件，请检查网络连接或手动下载文件到src/main/resources目录", e);
        }
    }
    
    public String getLocation(String ipAddress) {
        if (ipAddress == null || ipAddress.isEmpty()) {
            return "未知地址";
        }
        
        try {
            // 处理IPv6地址或本地地址
            if (ipAddress.contains(":") || "127.0.0.1".equals(ipAddress) || ipAddress.startsWith("192.168.") || ipAddress.startsWith("10.")) {
                return "内网地址";
            }
            
            // 查询IP地址的地理位置
            String location = searcher.search(ipAddress);
            
            // 格式化地理位置信息
            if (location != null && !location.isEmpty()) {
                // 通常格式为：国家|区域|省份|城市|ISP
                String[] parts = location.split("\\|");
                if (parts.length >= 4) {
                    String country = parts[0];
                    String region = parts[1];
                    String province = parts[2];
                    String city = parts[3];
                    
                    // 构建地理位置描述
                    StringBuilder sb = new StringBuilder();
                    
                    // 判断是否为中国
                    if ("中国".equals(country)) {
                        // 国内IP显示到省份
                        if (!"0".equals(province)) {
                            sb.append(province);
                        } else if (!"0".equals(region)) {
                            sb.append(region);
                        }
                    } else {
                        // 国外IP只显示到国家
                        if (!"0".equals(country)) {
                            sb.append(country);
                        }
                    }
                    
                    return sb.length() > 0 ? sb.toString() : "未知地址";
                }
                return location;
            }
            return "未知地址";
        } catch (Exception e) {
            logger.error("查询IP地址 {} 的地理位置失败", ipAddress, e);
            return "查询失败";
        }
    }
}